package com.project.gobang.controller;

import com.project.gobang.constants.Constants;
import com.project.gobang.model.UserInfo;
import com.project.gobang.service.UserService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @RequestMapping("/login")
    public Object login(String username, String password, HttpServletRequest request) {
        // 根据 username 去数据库中进行查询
        // 如果能找到对应的用户, 并且密码也一致, 则认为登录成功
        UserInfo user = userService.login(username);
        if (user == null || !user.getPassword().equals(password)) {
            // user 为空说明找不到该用户 || 找到该用户但是密码不正确.
            // 登录失败
            System.out.println("登录失败.");
            // 返回一个空的对象, 前端拿到空的对象就知道登录失败了.
            return new UserInfo();
        }
        // 像这种用户需要保持登录状态的情况, 就涉及到会话机制, 会话机制就绕不开 session
        // 需要将该用户保存到 session 中, 让服务器知道该用户是已经登录了的.
        // getSession() 中的参数为 true 表示如果会话是存在的, 直接返回存在的session, 如果不存在, 则创建一个新的session并返回
        // 如果参数为 false, 会话不存在时, 直接返回空, 不会创建一个新的.
        // 因为是登录的过程, 就允许用户登录后可以创建一个新的 session 来保存其信息
        HttpSession session = request.getSession(true);
        session.setAttribute(Constants.USER, user);

        // 登录成功
        return user;
    }

    @RequestMapping("/register")
    public Object register(String username, String password) {
        return userService.insertUserInfo(username, password);
    }

    @RequestMapping("/getUser")
    public Object getUserInfo(HttpServletRequest request) {
        // 这里就应该设置成 false, 如果用户并没有登录, 是拿不到用户信息的, 也就不应该创建一个新的session
        HttpSession session = request.getSession(false);

        // session 可能为空
        if (session == null) {
            // 返回一个 "无效对象"(空对象)
            return new UserInfo();
        }

        // 取出用户信息
        return session.getAttribute(Constants.USER);
    }
}
